﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using Ext.Net;
using FastTravel.BusinessLogic;
using ListItem = Ext.Net.ListItem;

namespace FastTravel.IntranetWeb
{
	/// <summary>
	/// Страница управления курортами
	/// </summary>
	public partial class Resort : BasePage
	{
		/// <summary>
		/// Загрузка страницы
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void Page_Load(object sender, EventArgs e)
		{
			if (!Page.IsPostBack)
			{
				BindCountryList();
			}
		}

		/// <summary>
		/// Заполняем список стран для фильтра
		/// </summary>
		private void BindCountryList()
		{
			var countryList = CountryManager.GetAll();
			foreach (var country in countryList)
			{
				comboFilterResortCountry.Items.Add(new ListItem(country.Name, country.ID.ToString()));
				comboNewResortCountry.Items.Add(new ListItem(country.Name, country.ID.ToString()));
				comboEditResortCountry.Items.Add(new ListItem(country.Name, country.ID.ToString()));
			}
		}

		/// <summary>
		/// Поиск (добавление фильтров)
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Параметры запроса</param>
		protected void BtnSearchResortClick(object sender, DirectEventArgs e)
		{
			grdResort.Reload();
			toolbarBottomPaging.SetPageIndex(0);
		}

		/// <summary>
		/// Получение списка курортов
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Параметры запроса</param>
		protected void StoreRefresh(object sender, StoreRefreshDataEventArgs e)
		{
			string filterByName = txtFilterResortName.Text == "" ? string.Empty : txtFilterResortName.Text;
			string filterByCountry = comboFilterResortCountry.SelectedItem.Value == "" ? "0" : comboFilterResortCountry.SelectedItem.Value;

			int totalCount = 0;
			var resortList = ResortManager.GetPageDTO(e.Start, e.Limit, e.Sort, e.Dir.ToString(), filterByName,  int.Parse(filterByCountry), out totalCount );
			e.Total = totalCount;

			this.grdResort.GetStore().DataSource = resortList;
		}

		/// <summary>
		/// Показать окно добавления нового курорта
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnAddResortClick(object sender, DirectEventArgs e)
		{
			BindCountryList();
			if (comboNewResortCountry.Items.Count <= 0)
			{
				ExtNet.Msg.Notify("Сообщение", "Добавьте хотя бы одну страну! Курорт не может быть без страны!").Show();
				return;
			}
			winResortNew.Show();
		}

		/// <summary>
		/// Добавление нового курорта в БД
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		protected void BtnConfirmNewResort(object sender, DirectEventArgs e)
		{
			//int countryId = Convert.ToInt32(comboNewResortCountry.SelectedItem.Value);

			ResortManager.Add(txtNewResortName.Text, int.Parse(comboNewResortCountry.SelectedItem.Value));
			if (BusinessLogicManager.TryCommit())
			{
				ExtNet.Msg.Notify("Сообщение", "Курорт добавлен!").Show();
				winResortNew.Hide();
				grdResort.Reload();
			}
			else
			{
				ExtNet.Msg.Notify("Ошибка", "Невозможно добавить курорт!").Show();
			}
			winResortNew.Hide();
			grdResort.Reload();
		}

		/// <summary>
		/// События таблицы курортов
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e">Аргумент с командами</param>
		public void GridAction(object sender, DirectEventArgs e)
		{
			int id = int.Parse(e.ExtraParams["id"]);
			int countryId = int.Parse(e.ExtraParams["CountryID"]);
			switch (e.ExtraParams["command"])
			{
				case "Edit":
					ShowEditWindow(id, countryId);
					break;
				case "Delete":
					if (ResortManager.HasHotels(id))
					{
						ExtNet.Msg.Notify("Ошибка", "Сначала удалите отели в этой стране!").Show();
					}
					else
					{
						ResortManager.Delete(id);
						if (BusinessLogicManager.TryCommit())
						{
							ExtNet.Msg.Notify("Сообщение", "Курорт удален!").Show();
							grdResort.Reload();
						}
						else
						{
							ExtNet.Msg.Notify("Ошибка", "Невозможно удалить курорт!").Show();
						}
					}
					break;
			}
		}

		/// <summary>
		/// Очистка полей окна редактирования
		/// </summary>
		protected void ClearEditWindow()
		{
			txtEditResortName.Reset();
			comboEditResortCountry.Reset();
		}

		/// <summary>
		/// Показать окно редактирования курорта
		/// </summary>
		/// <param name="resortId">ID курорта</param>
		/// <param name="countryId">ID страны, в которой находиться курорт</param>
		protected void ShowEditWindow(int resortId, int countryId)
		{
			DB.Resort resort = ResortManager.Get(resortId);
			if (resort != null)
			{
				BindCountryList();
				txtEditResortName.Text = resort.Name;

				comboEditResortCountry.SelectedItem.Value = countryId.ToString();
				Session["ResortID"] = resort.ID;
				winResortEdit.Show();
				comboEditResortCountry.Select(0);
			}
		}

		/// <summary>
		/// Редактирование существующего курорта
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param
		protected void BtnConfirmEditResort(object sender, DirectEventArgs e)
		{
			ResortManager.Update((int)Session["ResortID"], txtEditResortName.Text, int.Parse(comboEditResortCountry.SelectedItem.Value));
			if (BusinessLogicManager.TryCommit())
			{
				ExtNet.Msg.Notify("Сообщение", "Данные изменены!").Show();
				winResortEdit.Hide();
				grdResort.Reload();
			}
			else
			{
				ExtNet.Msg.Notify("Ошибка", "Невозможно изменить данные!").Show();
			}
			
		}
	}
}